// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本，
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3

package 工具类

import (
	"reflect"

	"gitee.com/go_888/goframe/internal/utils"
)

// Map浅拷贝 对于最常用的映射类型map[string]interface{}，执行从数据映射`data`到`copy`的浅复制。
// md5:f29e782d6173a097
func Map浅拷贝(Map值 map[string]interface{}) (新Map map[string]interface{}) {
	新Map = make(map[string]interface{}, len(Map值))
	for k, v := range Map值 {
		新Map[k] = v
	}
	return
}

// Map是否包含 检查映射数据 `data` 是否包含键 `key`。 md5:be6a3dd5c1d28037
func Map是否包含(Map值 map[string]interface{}, 名称 string) (结果 bool) {
	if len(Map值) == 0 {
		return
	}
	_, 结果 = Map值[名称]
	return
}

// Map删除名称s 从 map `data` 中删除所有 `keys`。 md5:3e89d2fe52825284
func Map删除名称s(Map值 map[string]interface{}, 名称s ...string) {
	if len(Map值) == 0 {
		return
	}
	for _, key := range 名称s {
		delete(Map值, key)
	}
}

// Map合并到目标 将源（src）映射中的所有映射合并到目标（dst）映射中。 md5:aa4647e55af49733
func Map合并到目标(目标 map[string]interface{}, 待合并s ...map[string]interface{}) {
	if 目标 == nil {
		return
	}
	for _, m := range 待合并s {
		for k, v := range m {
			目标[k] = v
		}
	}
}

// Map合并 创建并返回一个新地图，该地图合并了来自 `src` 的所有地图。 md5:b880aa85a1899404
func Map合并(Map值s ...map[string]interface{}) (新Map map[string]interface{}) {
	新Map = make(map[string]interface{})
	for _, m := range Map值s {
		for k, v := range m {
			新Map[k] = v
		}
	}
	return
}

// Map查找并忽略大小写与符号 尝试根据给定键（忽略大小写和符号）找到可能的 key-value 对。
//
// 请注意，此函数的性能可能较低。
// md5:4dd7c7511eb401cd
func Map查找并忽略大小写与符号(Map值 map[string]interface{}, 名称 string) (找到名称 string, 找到值 interface{}) {
	return utils.MapPossibleItemByKey(Map值, 名称)
}

// Map是否包含并忽略大小写与符号 检查给定的`key`是否包含在给定的映射`data`中。
// 它在检查键时忽略大小写和符号。
//
// 注意：此函数可能性能较低。
// md5:f1b183430304dc85
func Map是否包含并忽略大小写与符号(Map值 map[string]interface{}, 名称 string) bool {
	return utils.MapContainsPossibleKey(Map值, 名称)
}

// Map删除所有空值 从给定的映射中删除所有空值。 md5:9e670086c7ddbc0e
func Map删除所有空值(Map值 map[string]interface{}) {
	if len(Map值) == 0 {
		return
	}
	for k, v := range Map值 {
		if X是否为空(v) {
			delete(Map值, k)
		}
	}
}

// Map到数组 将映射转换为包含所有键和值的切片。
// 例如：{"K1": "v1", "K2": "v2"} => ["K1", "v1", "K2", "v2"]
// md5:bf557c548edfb4a6
func Map到数组(Map值 interface{}) []interface{} {
	var (
		reflectValue = reflect.ValueOf(Map值)
		reflectKind  = reflectValue.Kind()
	)
	for reflectKind == reflect.Ptr {
		reflectValue = reflectValue.Elem()
		reflectKind = reflectValue.Kind()
	}
	switch reflectKind {
	case reflect.Map:
		array := make([]interface{}, 0)
		for _, key := range reflectValue.MapKeys() {
			array = append(array, key.Interface())
			array = append(array, reflectValue.MapIndex(key).Interface())
		}
		return array
	}
	return nil
}
